package com.csea;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author Csea
 * @title
 * @date 2019/12/12 20:23
 */
public class Test1 {
    public static void main(String[] args) {
        //    批量数据 转换 stream对象
        Stream stream1 = Stream.of("admin", "tom", "damu");

        //  数组
        String[] strArray = new String[]{"xxxx", "yyyy"};
        Stream stream2 = Arrays.stream(strArray);

        // 列表
        List<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("西瓜");
        list.add("香蕉");
        list.add("菠萝");
        list.add("樱桃");
        Stream stream3 = list.stream();

        // 集合
        Set<String> set = new HashSet<>();
        set.add("华硕");
        set.add("Apple");
        set.add("联想");
        Stream stream4 = set.stream();

        // Map
        Map<String, Integer> map = new HashMap<>();
        map.put("tom", 100);
        map.put("jerry", 200);
        map.put("csea", 10000);
        Stream stream5 = map.entrySet().stream();

        // Stream 对象 对于基本数据类型的功能封装
        // int long  double
        IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);
        IntStream.range(1, 5).forEach(System.out::println);// 包含起始数据，不包含结束数据
        IntStream.rangeClosed(1, 5).forEach(System.out::println);// 包含起始数据，包含结束数据

        // Stream对象 --> 转换得到 指定的数据类型,stream 一次终端操作之后就不能再次操作了
        // 数组
        Object[] objx = stream1.toArray(String[]::new);

        // 字符串
        String str = stream1.collect(Collectors.joining()).toString();

        // 列表
        List<String> listx = (List<String>) stream1.collect(Collectors.toList());

        // 结合
        Set<String> setx = (Set<String>) stream1.collect(Collectors.toSet());

        // map
        Map<String, Object> mapx = (Map<String, Object>) stream1.collect(Collectors.toMap(x -> x, y -> "value:" + y));


        // stream中常见的API操作
        List<String> accountList = new ArrayList<>();
        accountList.add("xxxx");
        accountList.add("yyyyyy");
        accountList.add("zzzz");
        accountList.add("aaaaaa");

        // map中间操作，map()方法接收一个Function接口
        accountList = accountList.stream().map(x -> "梁山好汉" + x).collect(Collectors.toList());

        // filter() 添加过滤条件，过滤符合条件的用户
        accountList = accountList.stream().filter(x -> x.length() >= 5).collect(Collectors.toList());

        // forEach() 增强型循环
        accountList.forEach(x -> System.out.println("ForEach-> " + x));

        // peek() 中间操作，迭代数据完成数据的依次处理过程
        accountList.stream()
                .peek(x -> System.out.println("peek1 :" + x))
                .peek(x -> System.out.println("peek 2:" + x))
                .forEach(System.out::println);

        accountList.forEach(System.out::println);

        // stream对于数字运算的支持
        List<Integer> initList = new ArrayList<>();
        initList.add(1);
        initList.add(2);
        initList.add(22);
        initList.add(88);
        initList.add(22);

        // skip() 中间操作，有状态，跳过部分数据
        initList.stream().skip(3).forEach(System.out::println);

        // limit() 中间操作，有状态,限制输出数据量
        initList.stream().skip(3).limit(2).forEach(System.out::println);

        // distinct()中间操作，有状态,剔除重复的数据
        initList.stream().distinct().forEach(System.out::println);

        // sorted中间操作，有状态,排序
        initList.stream().sorted();
        // max() 获取最大值
        initList.stream().max((x, y) -> x - y);
        // min() 获取最小值
        // reduce()合并处理数据
        Optional optional = initList.stream().reduce((sum, y) -> sum + y);
    }

}
